﻿/********************************************************************************
** @ Date:2024/07/03
** @ Author: WeiXiaoYu
** @ Description: 图片下载类
** @ Version:1.0.0
** @ Fun:
********************************************************************************/
#ifndef CIMAGEDOWNLOADER_H
#define CIMAGEDOWNLOADER_H
#include <QObject>
#include <QLabel>
#include <QNetworkAccessManager>

class CImageDownloader : public QObject
{
    Q_OBJECT
public:
	// 构造函数 - 异步下载到QLabel
	explicit CImageDownloader(QLabel* label, const QString& imageUrl,
		const QString& username = "", const QString& password = "",
		QObject* parent = nullptr);
	explicit CImageDownloader(const QString& imageUrl,
		const QString& username = "", const QString& password = "",
		QObject* parent = nullptr);

    ~CImageDownloader();

	// 同步获取图片（阻塞式）
	bool getNewDlPixmap(QPixmap &newPixmap, int timeoutMs = 5000);

	// 设置认证信息
	void setCredentials(const QString& username, const QString& password);

	// 异步下载方法
	void downloadAsync();

	// 取消下载
	void cancelDownload();

signals:
	// 下载完成信号
	void downloadFinished(const QPixmap& pixmap);
	// 下载失败信号
	void downloadFailed(const QString& errorString);
	// 需要认证信号
	void authenticationRequired(const QString& realm);

public slots:
	// 异步下载完成槽函数
	void slotOnImageDownloaded();

private slots:
	// 认证处理
	void onAuthenticationRequired(QNetworkReply* reply, QAuthenticator* authenticator);
	// SSL错误处理
	void onSslErrors(QNetworkReply* reply, const QList<QSslError>& errors);

private:
	// 初始化网络管理器
	void initNetworkManager();
	// 创建网络请求
	QNetworkRequest createRequest() const;
	// 处理网络回复
	bool processReply(QNetworkReply* reply, QPixmap& resultPixmap);
	// 添加Basic认证头
	void addBasicAuthHeader(QNetworkRequest& request) const;

private:
	QLabel* m_imageLabel;
	QString m_sImageUrl;
	QNetworkAccessManager* m_networkManager;
	QNetworkReply* m_currentReply;
	QString m_username;
	QString m_password;
	bool m_isAuthenticated;
};

#endif // CIMAGEDOWNLOADER_H
